02bf84e062cb7eeade55c2a00cf393d24d3d87f9,rvm/src/org/jikesrvm/osr/ia32/CodeInstaller.java,CodeInstaller,install,#ExecutionState#CompiledMethod#,49

Before Change


      // restore saved EDI
      asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET);
      // restore saved EBX
      asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET);
      // restore frame pointer
      asm.emitPOP_RegDisp(TR, ArchEntrypoints.framePointerField.getOffset());
      // do not pop return address and parameters,

After Change


//        asm.emitINT_Imm(3);  // break here for debugging

      // unwind stack pointer, SP is FP now
      if (VM.BuildFor32Addr) {
        asm.emitADD_Reg_Imm(SP, sp2fpOffset.toInt());
      } else {
        asm.emitADD_Reg_Imm_Quad(SP, sp2fpOffset.toInt());
      }

      asm.generateJTOCloadWord(S0, cm.getOsrJTOCoffset());

      // restore saved EDI
      if (VM.BuildFor32Addr) {
        asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET);
      } else {
        asm.emitMOV_Reg_RegDisp_Quad(EDI, SP, EDI_SAVE_OFFSET);
      }
      // restore saved EBX
      if (VM.BuildFor32Addr) {
        asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET);
      } else {
        asm.emitMOV_Reg_RegDisp_Quad(EBX, SP, EBX_SAVE_OFFSET);
      }

      // restore frame pointer
      asm.emitPOP_RegDisp(TR, ArchEntrypoints.framePointerField.getOffset());
      // do not pop return address and parameters,
      // we make a faked call to newly compiled method
      asm.emitJMP_Reg(S0);
    } else if (cType == CompiledMethod.OPT) {
      ///////////////////////////////////////////////////
      // recover saved registers from foo's stack frame
      ///////////////////////////////////////////////////
      OptCompiledMethod fooOpt = (OptCompiledMethod) foo;

      // foo definitely not save volatile
      boolean saveVolatile = fooOpt.isSaveVolatile();
      if (VM.VerifyAssertions) {
        VM._assert(!saveVolatile);
      }

      // assume SP is on foo's stack frame,
      int firstNonVolatile = fooOpt.getFirstNonVolatileGPR();
      int nonVolatiles = fooOpt.getNumberOfNonvolatileGPRs();
      int nonVolatileOffset = fooOpt.getUnsignedNonVolatileOffset();

      for (int i = firstNonVolatile; i < firstNonVolatile + nonVolatiles; i++) {
        if (VM.BuildFor32Addr) {
          asm.emitMOV_Reg_RegDisp(NONVOLATILE_GPRS[i], SP, sp2fpOffset.minus(nonVolatileOffset));
        } else {
          asm.emitMOV_Reg_RegDisp_Quad(NONVOLATILE_GPRS[i], SP, sp2fpOffset.minus(nonVolatileOffset));
        }
        nonVolatileOffset += SW_WIDTH;
      }
      // adjust SP to frame pointer
      if (VM.BuildFor32Addr) {
        asm.emitADD_Reg_Imm(SP, sp2fpOffset.toInt());
      } else {
        asm.emitADD_Reg_Imm_Quad(SP, sp2fpOffset.toInt());